fix interator invalidation issue with trackfilter segment option. (#1153)
authortsteven4 <13596209+tsteven4@users.noreply.github.com>
Sun, 6 Aug 2023 23:23:24 +0000 (17:23 -0600)
committerGitHub <noreply@github.com>
Sun, 6 Aug 2023 23:23:24 +0000 (17:23 -0600)
and add a test case that demonstrates the issue.

reference/track/trackfilter_segment.csv [new file with mode: 0644]
reference/track/trackfilter_segment~csv.gpx [new file with mode: 0644]
testo.d/track.test
trackfilter.cc

diff --git a/reference/track/trackfilter_segment.csv b/reference/track/trackfilter_segment.csv
new file mode 100644 (file)
index 0000000..87950e3
--- /dev/null
@@ -0,0 +1,45 @@
+No,UTM-Zone,UTM-Ch,UTM-East,UTM-North,Name,Date,Time
+1,13,T,500000,4400000,Point01,2023-01-01,00:00:00
+2,13,T,500050,4400000,Point02,2023-01-01,00:00:10
+3,13,T,500100,4400000,Point03,2023-01-01,00:00:20
+4,13,T,500150,4400000,Point04,2023-01-01,00:00:30
+5,13,T,500200,4400000,Point05,2023-01-01,00:00:40
+6,13,T,500250,4400000,Point06,2023-01-01,00:00:50
+7,13,T,500300,4400000,Point07,2023-01-01,00:01:00
+8,13,T,500350,4400000,Point08,2023-01-01,00:01:10
+9,13,T,500400,4400000,Point09,2023-01-01,00:01:20
+10,13,T,500450,4400000,Point10,2023-01-01,00:01:30
+11,13,T,500450.2,4400000,Point11,2023-01-01,00:01:40
+12,13,T,500450.4,4400000,Point12,2023-01-01,00:01:50
+13,13,T,500450.6,4400000,Point13,2023-01-01,00:02:00
+14,13,T,500500,4400000,Point14,2023-01-01,00:02:10
+15,13,T,500550,4400000,Point15,2023-01-01,00:02:20
+16,13,T,500600,4400000,Point16,2023-01-01,00:02:30
+17,13,T,500650,4400000,Point17,2023-01-01,00:02:40
+18,13,T,500700,4400000,Point18,2023-01-01,00:02:50
+19,13,T,500750,4400000,Point19,2023-01-01,00:03:00
+20,13,T,500800,4400000,Point20,2023-01-01,00:03:10
+21,13,T,500850,4400000,Point21,2023-01-01,00:03:20
+22,13,T,500900,4400000,Point22,2023-01-01,00:03:30
+23,13,T,500950,4400000,Point23,2023-01-01,00:03:40
+24,13,T,510000,4400000,Point24,2023-01-01,01:00:00
+25,13,T,510050,4400000,Point25,2023-01-01,01:00:10
+26,13,T,510100,4400000,Point26,2023-01-01,01:00:20
+27,13,T,510150,4400000,Point27,2023-01-01,01:00:30
+28,13,T,510200,4400000,Point28,2023-01-01,01:00:40
+29,13,T,510250,4400000,Point29,2023-01-01,01:00:50
+30,13,T,510300,4400000,Point30,2023-01-01,01:01:00
+31,13,T,510350,4400000,Point31,2023-01-01,01:01:10
+32,13,T,510400,4400000,Point32,2023-01-01,01:01:20
+33,13,T,510450,4400000,Point33,2023-01-01,01:01:30
+34,13,T,510500,4400000,Point34,2023-01-01,01:01:40
+35,13,T,510550,4400000,Point35,2023-01-01,01:01:50
+36,13,T,510600,4400000,Point36,2023-01-01,01:02:00
+37,13,T,510650,4400000,Point37,2023-01-01,01:02:10
+38,13,T,510700,4400000,Point38,2023-01-01,01:02:20
+39,13,T,510750,4400000,Point39,2023-01-01,01:02:30
+40,13,T,510800,4400000,Point40,2023-01-01,01:02:40
+41,13,T,510850,4400000,Point41,2023-01-01,01:02:50
+42,13,T,510900,4400000,Point42,2023-01-01,01:03:00
+43,13,T,510950,4400000,Point43,2023-01-01,01:03:10
+
diff --git a/reference/track/trackfilter_segment~csv.gpx b/reference/track/trackfilter_segment~csv.gpx
new file mode 100644 (file)
index 0000000..8e3a906
--- /dev/null
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
+  <time>1970-01-01T00:00:00Z</time>
+  <bounds minlat="39.749837151" minlon="-105.000000000" maxlat="39.749907519" maxlon="-104.872184544"/>
+  <trk>
+    <trkseg>
+      <trkpt lat="39.749907519" lon="-105.000000000">
+        <time>2023-01-01T00:00:00Z</time>
+        <name>Point01</name>
+      </trkpt>
+      <trkpt lat="39.749907517" lon="-104.999416367">
+        <time>2023-01-01T00:00:10Z</time>
+        <name>Point02</name>
+      </trkpt>
+      <trkpt lat="39.749907513" lon="-104.998832734">
+        <time>2023-01-01T00:00:20Z</time>
+        <name>Point03</name>
+      </trkpt>
+      <trkpt lat="39.749907506" lon="-104.998249101">
+        <time>2023-01-01T00:00:30Z</time>
+        <name>Point04</name>
+      </trkpt>
+      <trkpt lat="39.749907495" lon="-104.997665468">
+        <time>2023-01-01T00:00:40Z</time>
+        <name>Point05</name>
+      </trkpt>
+      <trkpt lat="39.749907482" lon="-104.997081835">
+        <time>2023-01-01T00:00:50Z</time>
+        <name>Point06</name>
+      </trkpt>
+      <trkpt lat="39.749907466" lon="-104.996498203">
+        <time>2023-01-01T00:01:00Z</time>
+        <name>Point07</name>
+      </trkpt>
+      <trkpt lat="39.749907447" lon="-104.995914570">
+        <time>2023-01-01T00:01:10Z</time>
+        <name>Point08</name>
+      </trkpt>
+      <trkpt lat="39.749907425" lon="-104.995330937">
+        <time>2023-01-01T00:01:20Z</time>
+        <name>Point09</name>
+      </trkpt>
+      <trkpt lat="39.749907400" lon="-104.994747304">
+        <time>2023-01-01T00:01:30Z</time>
+        <name>Point10</name>
+      </trkpt>
+      <trkpt lat="39.749907400" lon="-104.994740300">
+        <time>2023-01-01T00:02:00Z</time>
+        <name>Point13</name>
+      </trkpt>
+      <trkpt lat="39.749907372" lon="-104.994163671">
+        <time>2023-01-01T00:02:10Z</time>
+        <name>Point14</name>
+      </trkpt>
+      <trkpt lat="39.749907341" lon="-104.993580038">
+        <time>2023-01-01T00:02:20Z</time>
+        <name>Point15</name>
+      </trkpt>
+      <trkpt lat="39.749907308" lon="-104.992996405">
+        <time>2023-01-01T00:02:30Z</time>
+        <name>Point16</name>
+      </trkpt>
+      <trkpt lat="39.749907271" lon="-104.992412772">
+        <time>2023-01-01T00:02:40Z</time>
+        <name>Point17</name>
+      </trkpt>
+      <trkpt lat="39.749907231" lon="-104.991829139">
+        <time>2023-01-01T00:02:50Z</time>
+        <name>Point18</name>
+      </trkpt>
+      <trkpt lat="39.749907189" lon="-104.991245507">
+        <time>2023-01-01T00:03:00Z</time>
+        <name>Point19</name>
+      </trkpt>
+      <trkpt lat="39.749907143" lon="-104.990661874">
+        <time>2023-01-01T00:03:10Z</time>
+        <name>Point20</name>
+      </trkpt>
+      <trkpt lat="39.749907095" lon="-104.990078241">
+        <time>2023-01-01T00:03:20Z</time>
+        <name>Point21</name>
+      </trkpt>
+      <trkpt lat="39.749907044" lon="-104.989494608">
+        <time>2023-01-01T00:03:30Z</time>
+        <name>Point22</name>
+      </trkpt>
+      <trkpt lat="39.749906989" lon="-104.988910975">
+        <time>2023-01-01T00:03:40Z</time>
+        <name>Point23</name>
+      </trkpt>
+    </trkseg>
+    <trkseg>
+      <trkpt lat="39.749848831" lon="-104.883273534">
+        <time>2023-01-01T01:00:00Z</time>
+        <name>Point24</name>
+      </trkpt>
+      <trkpt lat="39.749848243" lon="-104.882689902">
+        <time>2023-01-01T01:00:10Z</time>
+        <name>Point25</name>
+      </trkpt>
+      <trkpt lat="39.749847651" lon="-104.882106271">
+        <time>2023-01-01T01:00:20Z</time>
+        <name>Point26</name>
+      </trkpt>
+      <trkpt lat="39.749847057" lon="-104.881522640">
+        <time>2023-01-01T01:00:30Z</time>
+        <name>Point27</name>
+      </trkpt>
+      <trkpt lat="39.749846460" lon="-104.880939009">
+        <time>2023-01-01T01:00:40Z</time>
+        <name>Point28</name>
+      </trkpt>
+      <trkpt lat="39.749845860" lon="-104.880355378">
+        <time>2023-01-01T01:00:50Z</time>
+        <name>Point29</name>
+      </trkpt>
+      <trkpt lat="39.749845257" lon="-104.879771747">
+        <time>2023-01-01T01:01:00Z</time>
+        <name>Point30</name>
+      </trkpt>
+      <trkpt lat="39.749844651" lon="-104.879188116">
+        <time>2023-01-01T01:01:10Z</time>
+        <name>Point31</name>
+      </trkpt>
+      <trkpt lat="39.749844042" lon="-104.878604485">
+        <time>2023-01-01T01:01:20Z</time>
+        <name>Point32</name>
+      </trkpt>
+      <trkpt lat="39.749843430" lon="-104.878020854">
+        <time>2023-01-01T01:01:30Z</time>
+        <name>Point33</name>
+      </trkpt>
+      <trkpt lat="39.749842815" lon="-104.877437223">
+        <time>2023-01-01T01:01:40Z</time>
+        <name>Point34</name>
+      </trkpt>
+      <trkpt lat="39.749842198" lon="-104.876853592">
+        <time>2023-01-01T01:01:50Z</time>
+        <name>Point35</name>
+      </trkpt>
+      <trkpt lat="39.749841577" lon="-104.876269961">
+        <time>2023-01-01T01:02:00Z</time>
+        <name>Point36</name>
+      </trkpt>
+      <trkpt lat="39.749840954" lon="-104.875686330">
+        <time>2023-01-01T01:02:10Z</time>
+        <name>Point37</name>
+      </trkpt>
+      <trkpt lat="39.749840327" lon="-104.875102699">
+        <time>2023-01-01T01:02:20Z</time>
+        <name>Point38</name>
+      </trkpt>
+      <trkpt lat="39.749839698" lon="-104.874519068">
+        <time>2023-01-01T01:02:30Z</time>
+        <name>Point39</name>
+      </trkpt>
+      <trkpt lat="39.749839065" lon="-104.873935437">
+        <time>2023-01-01T01:02:40Z</time>
+        <name>Point40</name>
+      </trkpt>
+      <trkpt lat="39.749838430" lon="-104.873351806">
+        <time>2023-01-01T01:02:50Z</time>
+        <name>Point41</name>
+      </trkpt>
+      <trkpt lat="39.749837792" lon="-104.872768175">
+        <time>2023-01-01T01:03:00Z</time>
+        <name>Point42</name>
+      </trkpt>
+      <trkpt lat="39.749837151" lon="-104.872184544">
+        <time>2023-01-01T01:03:10Z</time>
+        <name>Point43</name>
+      </trkpt>
+    </trkseg>
+  </trk>
+</gpx>
index 299247e56d2e29603879bcd94e6c1a9b741f28e9..c925f5cc9158f763ffd82d677e8da0f477bc9c51 100644 (file)
@@ -77,4 +77,7 @@ compare ${REFERENCE}/track/simint250m.csv ${TMPDIR}/simint250m_2.csv
 gpsbabel -t -i unicsv -f ${REFERENCE}/track/simint.csv -x track,faketime=f2022+1 -o unicsv,utc -F ${TMPDIR}/simint1000m.csv
 compare ${REFERENCE}/track/simint1000m.csv ${TMPDIR}/simint1000m.csv
 
+# segment
+gpsbabel -t -i unicsv,utc -f ${REFERENCE}/track/trackfilter_segment.csv -x track,segment -o gpx -F ${TMPDIR}/trackfilter_segment~csv.gpx
+compare ${REFERENCE}/track/trackfilter_segment~csv.gpx ${TMPDIR}/trackfilter_segment~csv.gpx
 
index 82022081e522eda7392b7894407f33833b33188e..77ec41acaf235f08c349e65d8a2229503cca9de9 100644 (file)
@@ -917,7 +917,8 @@ void TrackFilter::trackfilter_segment_head(const route_head* rte)
   // (Empirically determined; It's a few dozen feet.)
   const double ktoo_close = 0.000005;
 
-  for (auto it = rte->waypoint_list.cbegin(); it != rte->waypoint_list.cend(); ++it) {
+  const auto wptlist = rte->waypoint_list; // track_del_wpt will modify rte->waypoint_list
+  for (auto it = wptlist.cbegin(); it != wptlist.cend(); ++it) {
     auto* wpt = *it;
     if (index > 0) {
       double cur_dist = gcdist(RAD(prev_wpt->latitude),
@@ -930,7 +931,7 @@ void TrackFilter::trackfilter_segment_head(const route_head* rte)
       }
 
       if (cur_dist < ktoo_close) {
-        if (wpt != rte->waypoint_list.back()) {
+        if (wpt != wptlist.back()) {
           auto* next_wpt = *std::next(it);
           if (trackfilter_points_are_same(prev_wpt, wpt) &&
               trackfilter_points_are_same(wpt, next_wpt)) {